現在我們可以來嘗試能對收到的 Image message 做怎樣的操作,我們可以使用line_bot_api.get_message_content()
來獲取檔案資訊
@handler.add(MessageEvent)
def handle_message(event):
if (event.message.type == "image"):
SendImage = line_bot_api.get_message_content(event.message.id)
print(SendImage)
我們可以取得如下的資訊
<linebot.models.responses.Content object at 0x000001A19C24E908>
而如果我們想要看到對應的圖片,需要將它重新寫檔下來,並存放到自己指定的位置,如下列程式碼,這時候當我們接受到 Image message 時,就可以在資料夾中看到對應的圖片了。
@handler.add(MessageEvent)
def handle_message(event):
if (event.message.type == "image"):
SendImage = line_bot_api.get_message_content(event.message.id)
path = './Image/' + event.message.id + '.png'
with open(path, 'wb') as fd:
for chenk in SendImage.iter_content():
fd.write(chenk)
再來如果我們想要回傳 Image message, Line API 會要求你給的資訊是圖片的 URL,而如果你想要將使用者傳送過來的圖片直接或處理過後回傳,圖片的 URL 要怎麼取得呢?這邊嘗試了兩種方式,一是透過 imgur 的 API 上傳圖片並取得對應的 URL,二是透過 static 讓靜態檔案路徑可以轉為URL被外部瀏覽。
用 imgur API 的方式會需要先去註冊一個 Imgur App 帳號(連接在上方),Authorization type 部分選擇第二個不用回傳 URL。再輸入完 email 後按下 submit,就可以看到 App 的 ID。
接著我們要到 cmd install pyimgur,並在程式碼中引入,再來我們可以寫個函式去取得圖片的 URL。pyimgur 中要上傳圖片會需要給 App ID 來讓他知道要上傳到哪個帳號,並告訴他要將哪一張圖片上傳,就可以取得對應的 URL了。
def glucose_graph(client_id, imgpath):
im = pyimgur.Imgur(client_id)
upload_image = im.upload_image(imgpath, title="Uploaded with PyImgur")
return upload_image.link
接著我們就可以在 handle_message
中加上呼叫glucose_graph
來取得圖片的 url 去做回傳。且因為這次要傳送的是 Image message,所以在linebot.models
的地方要多引入ImageSendMessage
@handler.add(MessageEvent)
def handle_message(event):
if (event.message.type == "image"):
SendImage = line_bot_api.get_message_content(event.message.id)
local_save = './Image/' + event.message.id + '.png'
with open(local_save, 'wb') as fd:
for chenk in SendImage.iter_content():
fd.write(chenk)
img_url = glucose_graph(client_id, local_save)
line_bot_api.reply_message(event.reply_token, ImageSendMessage(original_content_url=img_url, preview_image_url=img_url))
flask 本身默認靜態檔案會放置於 static 中,所以可以一開始就將圖片存放在 static 資料夾,傳送的時用 網址 + static + 圖片名稱就可以正常傳送。像是我現在測試是用 ngrok 取得網址,因此就會寫成下面這樣。
ngrok_url = "https://88b3-1-171-241-102.ngrok.io"
@handler.add(MessageEvent)
def handle_message(event):
if (event.message.type == "image"):
SendImage = line_bot_api.get_message_content(event.message.id)
local_save = './static/' + event.message.id + '.png'
with open(local_save, 'wb') as fd:
for chenk in SendImage.iter_content():
fd.write(chenk)
line_bot_api.reply_message(event.reply_token, ImageSendMessage(original_content_url = ngrok_url + "/static/" + event.message.id + ".png", preview_image_url = ngrok_url + "/static/" + event.message.id + ".png"))
現在就可以嘗試傳送圖片給 Line bot,看他能否成功的將圖片給回傳了。
你好,
請問有辦法取得使用者傳送檔案的檔名嘛 ?
謝謝
根據收到的event裡面我是沒看到有檔案名稱拉
更詳細的你可以看看官方文件的Image部分
https://developers.line.biz/en/reference/messaging-api/#message-event
你好
請問第二部分,寫def glucose_graph(client_id, imgpath)時,path 是從static 本端引進嗎? 我的理解是,因為不想24小開機,打算放雲端,在這樣的情況下,會否沒辦法把path 從本端叫出來?
如果是,想問能否有其他思路方式呢?